//
//  StatusListWithModel.swift
//  Weibo
//
//  Created by apple on 15/12/11.
//  Copyright © 2015年 idcast. All rights reserved.
//

import Foundation
import SDWebImage

class StatusListViewModel {
    
    //微博数据数组 上拉下拉刷新
    lazy var statusList = [StatusViewModel]()
    
   
    //加载微博数据库
    
    func loadStatus(isPullup isPullup: Bool, finished: (isSuccessde: Bool) -> ()) {
        
        //下拉刷新 数组中的第一条微博
        let since_id = isPullup ? 0 : (statusList.first?.status.id ?? 0)
        
        //上拉刷新 数组中的最后一条微博
        let max_id = isPullup ? (statusList.last?.status.id ?? 0) : 0
        
        NetwokeTools.sharedTools.loadStatus(since_id: since_id, max_id: max_id) { (result, error) -> () in
            if error != nil {
                
                print("------出错了")
                return
            }
            //判断result 的数据结构是否争取
            guard let array = result?["statuses"] as? [[String: AnyObject]] else {
                
                print("数据格式错误")
                return
            }
            //遍历字典中的数组 字典转模型
            //1 可变的数组
            var dataList = [StatusViewModel]()
            // 2. 遍历数组
            for dict in array {
                dataList.append(StatusViewModel(status: Status(dict: dict)))
            }
            
            print("刷新到\(dataList.count) 条数据")
            
            // 3. 拼接数据
            //判断是否是上拉刷新
            if max_id > 0 {
                
            self.statusList += dataList
                
            }else {
            
                self.statusList = dataList + self.statusList
            }
            
            //4 缓存单张图片
            self.cacheSingleImage(dataList, finished: finished)
        }
    }
    //缓存单张图片
    private func cacheSingleImage(dataList: [StatusViewModel], finished: (isSuccessde: Bool) -> ()) {
        //1 创建调度组
        let group = dispatch_group_create()
        //定义个长度
        var dataLength = 0
    
        //2 遍历试图模型数组
        for vm in dataList {
            //判断图片是否值多张图片
            if vm.thumbnailUrks?.count != 1 {
            
                continue
            }
//            print(vm.thumbnailUrks)
            //获取url
            let url = vm.thumbnailUrks![0]
            print("开始缓存\(url)")
            //SDWebImage 下载图像（缓存是自动完成的）
            //入组 监听后续的 block
            dispatch_group_enter(group)
            
            //SDWebImage的核心下载函数  如果本地缓存已经存在 同样会通过完成回调返回
            //如果设置了SDWebImageOptions.RetryFailed，如果下载失败 block会结束一次 会做一次出租
            //SDWebImage 会重新执行下载 下载完成后 再次调用block中的代码
            // 在次调用出租函数 造成调度组的不匹配
            //SDWebImageOptions.RefreshCached第一次发起网络请求 把缓存图片的一个 hash 值发给服务器
            //服务器比对 hash 值 如果和服务器内容一致 服务器返回的状态码是304 表示服务器内容没有变化
            //如果不是304会再次发起网络请求 获得更新后的内容

            SDWebImageManager.sharedManager().downloadImageWithURL(url,
                options: [],
                progress: nil, completed: { (image, _, _, _, _) -> Void in
                    //单张图片进度下载完成 计算长度
                    if let img = image,
                        let data = UIImagePNGRepresentation(img) {
                    
                            //累加二进制数据的长度
                            dataLength += data.length
                    }
                    
                    
                    //出组
                    dispatch_group_leave(group)
            })
        }
        //3 监听调度组完成
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            print("缓存完成\(dataLength / 1024) K")
            finished(isSuccessde: true)
        }
    }
}

